Python技巧

命令行参数

sys.args 简单参数

Python 内置的 sys.argv 保存了完整的参数列表

import sys

file = sys.argv[0]
source = sys.argv[1]
target = sys.argv[2]

print(sys.argv) # ['sys.py', 'abc', 'def', 'g']
print(len(sys.argv)) # 4

print(file) # sys.py
print(source) # abc
print(target) # def
def __init__(self,
    prog=None,
    usage=None,
    description=None,
    epilog=None,
    parents=[],
    formatter_class=HelpFormatter,
    prefix_chars='-',
    fromfile_prefix_chars=None,
    argument_default=None,
    conflict_handler='error',
    add_help=True,
    allow_abbrev=True,
    exit_on_error=True):

主要参数介绍:

pnex3

给一个 ArgumentParser 添加程序参数信息,是通过调用 add_argument() 方法完成的

parser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][,choices][, required][, help][, metavar][, dest])

add_argument 参数解释:

parser.add_argument("--p2", action='store', default="p2_default")
python3 arg_demo.py --p2 p2val 
parser.add_argument("--p1", action='store_const', const="p1_const", default="p1_default")
python3 arg_demo.py --p1 ### 取值为const,即p1_const
python3 arg_demo.py ### 没有指定默认值为p1_default

位置参数(positional arguments):必须填写
可选择参数(options):根据 required 来定是否未必填

示例

示例 1:位置参数和可选参数

parser.add_argument('filename')           # positional argument
parser.add_argument('-c', '--count')      # option that takes a value
parser.add_argument('-v', '--verbose',
                    action='store_true')  # on/off flag
### 解析参数
args = parser.parse_args()
print(args.filename, args.count, args.verbose)

python3 arg_demo.py filename -c c -v

示例 2:获取一个整数列表并计算总和或者最大值

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

当使用适当的参数运行时,它会输出命令行传入整数的总和或者最大值:

python prog.py 1 2 3 4
4
python prog.py 1 2 3 4 --sum
10

如果传入了无效的参数,将显示一个错误消息:

python prog.py a b c
usage: prog.py [-h] [--sum] N [N …]
prog.py: error: argument N: invalid int value: 'a'

示例 3:一个备份 MySQL 数据库的命令行程序

host 参数:表示 MySQL 主机名或 IP,不输入则默认为 localhost;
port 参数:表示 MySQL 的端口号,int 类型,不输入则默认为 3306;
user 参数:表示登录 MySQL 的用户名,必须输入;
password 参数:表示登录 MySQL 的口令,必须输入;
gz 参数:表示是否压缩备份文件,不输入则默认为 False;
outfile 参数:表示备份文件保存在哪,必须输入。
其中,outfile 是位置参数,而其他则是类似 --user root 这样的 " 关键字 " 参数。

def main1():
    # 定义一个ArgumentParser实例:
    parser = argparse.ArgumentParser(
        prog='backup-mysql',
        usage="用于备份mysql",
        description='Backup mysql database.',
        epilog='参数描述后面的文本',
        argument_default=""
    )
    # 定义位置参数:
    parser.add_argument('outfile')
    # 定义关键字参数:
    parser.add_argument('--host', default='localhost')
    # 此参数必须为int类型:
    parser.add_argument('--port', default='3306', type=int)
    # 允许用户输入简写的-u:
    parser.add_argument('-u', '--user', required=True)
    parser.add_argument('-p', '--password', required=True)
    parser.add_argument('--database', required=True)
    # gz参数不跟参数值,因此指定action='store_true',意思是出现-gz表示True:
    parser.add_argument('-gz', '--gzcompress', action='store_true', required=False, help='Compress backup files by gz.')

    # 解析参数:
    args = parser.parse_args()
    # 打印参数:
    print('parsed args:')
    print(f'host = {args.host}')
    print(f'port = {args.port}')
    print(f'user = {args.user}')
    print(f'password = {args.password}')
    print(f'database = {args.database}')
    print(f'gzcompress = {args.gzcompress}')

    print(f'sys.argv[0]={sys.argv[0]}')

python3 back_mysql.py -u root -p hello --database testdb backup.sql
parsed args:
host = localhost
port = 3306
user = root
password = hello
database = testdb
gzcompress =
sys.argv[0]=arg_demo.py